import javax.swing.*;

import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;


public class Spielfeld extends JPanel {
    //"serialVersionUID" Wird von Eclipse verlangt!
    private static final long serialVersionUID = 1L;
    private SpielFunktionen mSpielFunktionen;
    private int mSelectedZeile; //wird auf -1 gesetzt erst wenn etwas angeklickt auf einen "richtigen" Wert
    private int mSelectedSpalte;
    private boolean mFieldIsSelected = false;
    boolean mSchwarzDran;
    boolean mZustandRot;
    boolean mZustandSchwarz;
    SpielFunktionen.Zustand mZustandZiel;

    /**
     * Konstruktor
     */
    public Spielfeld(JFrame frame, final SpielFunktionen spielFunktionen, final RegelController regelController) {
        mSpielFunktionen = spielFunktionen;

        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                //Mausposition wird abgefragt
                int xPos = e.getX();
                int yPos = e.getY();

                //Ausrechnung auf welchem Feld sich die Maus gerade befindet
                int destZeile = (yPos >= 20) ? (yPos - 20) / 81 : -1;
                int destSpalte = (xPos >= 20) ? (xPos - 20) / 81 : -1;

                if (destZeile < 8 && destSpalte < 8 && destZeile >= 0 && destSpalte >= 0) {
                    setVariableProClickBeforeCheck(destZeile, destSpalte);
                    if ((mZustandRot && !mSchwarzDran) || (mZustandSchwarz && mSchwarzDran) || mFieldIsSelected) {
                        if (!mFieldIsSelected) {
                            setVariableOnNonSelectedField(destZeile, destSpalte);
                            mSpielFunktionen.setSelectedFiledSelected(mSelectedZeile, mSelectedSpalte);
                        } else if (mSchwarzDran && (mSelectedZeile >= destZeile)) {
                            regelController.schwarzIstDran(mZustandZiel, mSelectedZeile, mSelectedSpalte, destZeile, destSpalte);
                        } else if (!mSchwarzDran && (mSelectedZeile <= destZeile)) {
                            regelController.rotIstDran(mZustandZiel, mSelectedZeile, mSelectedSpalte, destZeile, destSpalte);
                        }
                        repaint();
                    }
                }
            }
        });
    }

    @Override
    public void paint(Graphics graphic) {
        super.paint(graphic);

		/*Ankerpunkt(Linksoben) fr das Gitternetz*/
        int xStart = 20;
        int yStart = 20;

        //Raster virtuell zeichnen
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 8; j++) {
                Image image = null;
                switch (mSpielFunktionen.getZustand(i, j)) {
                    case ROT:
                        image = new ImageIcon(getClass().getResource("rot.png").getPath()).getImage();
                        break;
                    case SCHWARZ:
                        image = new ImageIcon(getClass().getResource("schwarz.png").getPath()).getImage();
                        break;
                    case BRAUN:
                        image = new ImageIcon(getClass().getResource("braun.png").getPath()).getImage();
                        break;
                    case WEISS:
                        image = new ImageIcon(getClass().getResource("weiss.png").getPath()).getImage();
                        break;
                    case ROTDAME:
                        image = new ImageIcon(getClass().getResource("damerot.png").getPath()).getImage();
                        break;
                    case SCHWARZDAME:
                        image = new ImageIcon(getClass().getResource("dameschwarz.png").getPath()).getImage();
                        break;
                    case ROTSELECTED:
                        image = new ImageIcon(getClass().getResource("rotselected.png").getPath()).getImage();
                        break;
                    case SCHWARZSELECTED:
                        image = new ImageIcon(getClass().getResource("schwarzselected.png").getPath()).getImage();
                        break;
                    default:
                        image = null;
                }
                if (image != null) {
                    graphic.drawImage(image, xStart + j * 80, yStart + i * 80, 80, 80, this);
                }
                xStart += 1;
            }
            xStart = 20;
            yStart += 1;
        }
    }

    private void setVariableProClickBeforeCheck(int destZeile, int destSpalte) {
        mZustandZiel = mSpielFunktionen.getZustand(destZeile, destSpalte);
        mSchwarzDran = mSpielFunktionen.isSpielerSchwarzIstDran();
        mZustandRot = mZustandZiel.equals(SpielFunktionen.Zustand.ROT);
        mZustandSchwarz = mZustandZiel.equals(SpielFunktionen.Zustand.SCHWARZ);
        mFieldIsSelected = mSpielFunktionen.getFieldIsSelected();
    }

    private void setVariableOnNonSelectedField(int destZeile, int destSpalte) {
        mSelectedZeile = destZeile;
        mSelectedSpalte = destSpalte;
        mFieldIsSelected = true;
    }
}
